from mfrc522 import MFRC522  # 导入MFRC522库，处理RFID的通信
from os import uname  # 导入系统信息库，用于识别平台
from time import sleep  # 导入延迟函数

# 创建MFRC522对象，初始化RFID读卡器模块的引脚
# 参数分别为: sck引脚, mosi引脚, miso引脚, rst引脚(空), cs(sda)引脚
rfid = MFRC522(0, 2, 4, 5, 14)

def read_all_data():
    """
    读取RFID卡片的所有数据块（64个block），并输出每个block的数据。
    如果读取失败，输出相应的错误信息。
    """
    
    while True:
        # 发送卡片检测请求，REQIDL用于检测卡片进入天线区
        stat, tag_type = rfid.request(rfid.REQIDL)
        print("检测卡片中...")  # 提示用户检测过程

        # 如果检测到卡片
        if stat == rfid.OK:
         
            # 防冲突检测，提取卡片的唯一ID号（UID）
            stat, raw_uid = rfid.anticoll()

            # 如果成功提取到卡片的UID
            if stat == rfid.OK:
                # 格式化并显示卡片的ID号
                _id = "0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
                print("RFID卡片的ID:", _id)

                # 选择卡片，准备与之进行交互
                if rfid.select_tag(raw_uid) == rfid.OK:
                    # 使用默认密钥 0xFF 进行认证
                    key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

                    # 循环读取每个block (共64个block)
                    for i in range(64):
                        # 对每个block进行认证
                        if rfid.auth(rfid.AUTHENT1A, i, key, raw_uid) == rfid.OK:
                            # 成功认证后，读取block的数据
                            print("%d -->" % i, rfid.read(i))
                        else:
                            # 如果认证失败，显示错误信息
                            print("%d -->" % i, "认证失败...")

                    # 停止加密通信，释放卡片
                    rfid.stop_crypto1()

        # 每次读取完毕后，等待1秒以避免频繁检测
        sleep(1)

# 主程序，调用读取数据函数
if __name__ == '__main__':
    read_all_data()
